..:: Menu ::.. ..:: Lekcja 6: Zapisywanie konfiguracji programu ::.. ..::Info i Reklamy::..

Wykorzystanie rejestru i plików INI

Być może zastanawiasz się do czego służy rejestr i pliki INI. Rejestr Windows służy do zapisywania konfiguracji programów. Wyobraź sobie, że chciałbyś zapisać ustawienia Twojego programu. Przykładowo piszesz tekst w komponencie "Edit", zamykasz program, a następnie uruchamiasz go ponownie i na etykiecie widnieje taki sam tekst jak przy zamykaniu programu. Można to łatwo zrobić z wykorzystaniem rejestru lub plików INI.
Najpierw rejestr. Przede wszystkim, aby korzystać z rejestru musisz do listy modułów uses dodać słowo "Registry".
1. Umieść na formularzu komponent "MaskEdit" ( paleta: Additional ). Komponent ten służy do ustawiania tzw. maski. Znaczy to, że Delphi 'dopilnuje', żebyś wpisał np. numer kodu. Za chwilę sam się o tym przekonasz. W Inspektorze Obiektów zmień nazwę komponentu na "Password". Teraz odnajdź pole "EditMask" - pojawi się okienko do wyboru maski. Po lewej stronie kliknij "ZipCode". Oznacza to, że hasło składać się będzie z pięciu cyfr. Kliknij OK - maska została ustawiona. Teraz odnajdź pole "PasswordChar". W tym polu należy wpisać znak, który będzie "przysłaniał" pisany przez Ciebie kod. W tej właściwości wpisz znak *. Teraz zamiast pisanych cyfr pojawiać się będzie właśnie ten znak.
2. Wygeneruj procedurę "OnDestroy" formy - uruchamiana ona będzie w chwili gdy użytkownik zamknie program. Wpisz w nią taki tekst ( później objaśnię ):
procedure TForm1.FormDestroy(Sender: TObject);
var
Reg : TRegistry; // zmienna wskazuje na rejestr
begin
Reg := TRegistry.Create;
try
Reg.OpenKey('Software\Delphi Kurs', True); // stworzenie klucza
Reg.WriteString('Haslo', Password.Text); // utworzenie wartosci
finally
Reg.Free; // zwolnij pamięć
end;
end;
Od tej pory przy zamykaniu programu do rejestru zostanie wpisane hasło z komponentu "Password". Już wyjaśniam o co właściwie chodzi. Na samym początku należało utworzyć zmienną typu "Registry". Później ją stworzyłem. Następnie polecenie "Reg.OpenKey" otwiera klucz z rejestru. Wartości domyślnie są zapisywane do klucza głównego HKEY_CURRENT_USER. A więc w nawiasie tej funkcji jako pierwszy parametr podawana jest nazwa klucza, który ma zostać otwarty. Drugi parametr "mówi" czy klucz ma być utworzony jeżeli nie istnieje ( True ), czy też nie ( False ). Kolejna funkcja do "Reg.WriteString". Zapisuje ona do rejestru wartość typu "String". Pierwszym parametrem tej funkcji jest nazwa klucza do zapisania, a drugim sama wartość typu "String". W tej funkcji do rejestru zapisana została treść kontrolki "Edit". Na samym końcu następuje zwolnienie pamięci zajętej przez zmienną "Reg". Zauważ, że użyłem tutaj wyjątków. Powoduje to bezwzględne zwolnienie pamięci bez względu na to czy operacja się powiedzie, czy też nie. OK, uruchom teraz program i zamknij go - do rejestru zapisana została wartość typu "String". Możesz to sprawdzić. Uruchom rejestr ( Start -> Uruchom -> Regedit ). Wartość nasza została do rejestru zapisana pod kluczem: HKEY_CURRENT_USER\Software\Delphi Kurs. Możesz to sprawdzić.
Dobra. Jeżeli hasło znajduje się już w rejestrze to należy wygenerować procedurę "OnCreate" formy, która sprawdzać będzie hasło. Poniższa procedura ma sprawdzać czy klucz w rejestrze istnieje. Jeżeli nie to nic nie robi - jeżeli istnieje to wyświetl okno z prośbą o wpisanie hasła:
procedure TForm1.FormCreate(Sender: TObject);
var
Reg : TRegistry; // zmienna oznaczajaca rejestr
Istnieje : Boolean;
begin
Reg := TRegistry.Create; // stworz rejestr
try
{ Jezeli klucz istnieje to zmienna "Istnieje" przyjmuje wartosc True }
Istnieje := Reg.OpenKey('Software\Delphi Kurs', False);
if Not Istnieje then // Jezeli zmienna = False to znaczy, ze klucz nie istnieje...
Exit else //... wtedy nie rob nic. Jezeli klucz istnieje to wywolaj okno:
if InputBox('Podaj hasło!', 'Wpisz hasło:', '') <> Reg.ReadString('Haslo') then
begin // Jezeli haslo jest nieprawidlwe
MessageDlg('Błędne hasło. Program zostanie zakończony!', mtError, [mbOK], 0);
Application.Terminate; // zakoncz program
end;
finally
Reg.Free;
end;
end;
Ta procedura jest trochę dłuższa i trudniejsza. Sprawdza ona bowiem czy klucz istnieje. Zmienna "Istnieje" przechowuje informacje o tym, czy klucz istnieje, czy też nie. Następuje otwarcie klucza. Jeżeli klucz istnieje to zmienna "Istnieje" przybiera wartość True. Jeżeli jest odwrotnie to False. Następnie następuje sprawdzenie jaka jest wartość zmiennej "Istnieje". Jeżeli False ( if not Istnieje then... znaczy to samo co if Istnieje = False then.... ) to nic się nie dzieje. Polecenie "Exit" działa tak samo jak "Break" - przerywa działanie programu. Jeżeli klucz istnieje to wyświetlane jest okno z informacją o podanie hasła. Umożliwia to funkcja "InputBox. Pierwszym jej parametrem jest tekst, który pojawi się na pasku okna, drugi to tekst etykiety, a ostatni to domyślne hasło, które pojawi się w oknie typu "Edit". Następuje tutaj porównanie wpisanego hasła z wartością wczytaną z rejestru ( Reg.ReadString ). Jeżeli te dwie wartości są różne to następuje wyświetlenie odpowiedniej informacji ( MessageDlg - mowa o tym była we wcześniejszych odcinkach ) i zakończenie programu. Normalnie do zakończenia działania programu służy polecenie "Close", ale działa ono tylko wtedy gdy widoczna jest forma. Jeżeli forma jest niewidoczna to należy stosować Application.Terminate, która kończy działanie programu.
Oczywiście możesz także zapisywać wartości typu "Integer" czy "Boolean", a nawet datę czy wartości zmienno - przecinkowe. Oto przykłady:
// typ Integer
Reg.WriteInteger('WartoscInteger', 12);
// zapisana liczba 12

// odczyt typu Integer
Edit1.Text := IntToStr(
Reg.ReadString('WartoscInteger'));

// typ Boolean
Reg.WriteBool('WartoscBoolean', True);
// zapisana wartość True

// odczytanie wartości Boolean:
Checkbox1.Checked := Reg.ReadBool(
'WartoscBoolean');

// typ zmienno - przecinkowy
Reg.WriteCurrency('WartoscCurrency', 3.12);
// zapisanie 3.12

// odczyt wartości Currency:
Edit2.Text := CurrToStr(
Reg.ReadCurrency('WartoscCurrency'));

// zapisz aktualną datę i czas
Reg.WriteDateTime('DataIczas', Now);

// odczytaj datę i czas
Edit3.Text := DateTimeToStr(
Reg.ReadDateTime('DataIczas')); // odczytaj datę i czas

Oto dodatkowe funkcje związane z rejestrem:
CloseKey; Zamyka dotychczasowo otwarty klucz.
DeleteKey; Usuwa klucz - np: Reg.DeleteKey('Software\Programowanie');
DeleteValue; Usuwa jedynie wartość klucza: Reg.DeleteValue('WartoscBoolean');
KeyExists; Funkcja zwraca wartość True jeżeli podany w nawiasie klucz istnieje.
MoveKey; Przenosi klucz z jednego miejsca na drugie: Reg.MoveKey('Software\Programowanie', 'Software\SFP', False); Ostatni parametr mówi czy stary klucz ma być usunięty.
RootKey; Nazwa klucza głównego: Reg.RootKey := HKEY_CLASSES_ROOT;
ValueExists; Sprawdza, czy wartość klucza podana w nawiasie istnieje.
ReadString; Odczytuje wartość String.
WriteString; Zapisuje wartość String .
WriteInteger; Zapisuje wartość Integer.
ReadInteger; Odczytuje wartość Integer.
WriteBool; Zapisuje wartość typu Boolean
ReadBool; Odczytuje wartość typu Boolean .
WriteDateTime; Zapisuje datę oraz czas.
ReadDateTime; Odczytuje datę oraz czas.
WriteCurrency; Zapisuje wartość zmienno - przecinkową.
ReadCurrency ; Odczytuje wartość zmienno - przecinkową.
GetKeyNames ; Zwraca w postaci "TStrings" wszystkie pod-klucze danego klucza.
GetValueNames; Zwraca wartości danego klucza: Reg.GetValueNames('Software\Programowanie');

Domyślnie w Delphi wszystkie klucze zapisywane są do klucza głównego HKEY_CURRENT_USER. Jeżeli chcesz to zmienić to rób tak:
Reg.RootKey := HKEY_CLASSES_ROOT;
Reg.OpenKey('Moj Klucz', True);

Pliki INI

Operowanie na plikach INI jest bardzo podobne. Istnieją różnice, oczywiście, ale są one małe. Być może wiesz lub nie, że plik INI składa się z sekcji. Są różne sekcje, a w nich nazwy kluczy i ich wartości. Żeby korzystać z plików INI musisz do listy modułów uses dodać słowo "INIFiles". W procedurze możesz napisać:
var
INI : TINIFile;
begin
INI := TINIFile.Create('C:\plikini.ini'); // stworz plik INI na dysku C
try
INI.WriteString('Sekcja01', 'Klucz', Edit1.Text);
finally
INI.Free;
end;
end;
Taka procedura spowoduje zapisanie odpowiednich wartości do pliku INI, który zostanie stworzony na dysku C. Na początku stworzona została zmienna typu "TINIFile", której parametrem jest ścieżka gdzie plik ma być zapisany. Później następuje do pliku INI wartości typu String. Pierwszym parametrem tej funkcji jest nazwa sekcji. Drugi parametr to nazwa klucza, a ostatnim to wartość która ma być zapisana do pliku INI. Wartość ta to tekst , który przechowywany jest w kontrolce Edit.
Jeżeli podczas tworzenia pliku INI nie podczas konkretnej ścieżki, a tylko nazwę pliku INI to ten plik zostanie stworzony w katalogu z Windowsem.
Teraz odczytanie wartości:
var
INI : TINIFile;
begin
INI := TINIFile.Create('C:\Plikini.ini');
try
Edit1.Text := INI.ReadString('Sekcja01', 'Klucz', 'Domyślna wartość');
finally
INI.Free;
end;
end;
Odczytywanie jest bardzo podobne. Zostanie stworzenie zmiennej INI, a następnie odczytanie wartości. Do tekstu kontrolki Edit zostanie odczytany klucz z pliku INI. Pierwszym jej parametrem jest nazwa sekcji z pliku INI, kolejny to nazwa klucza, a ostatnia wartość to domyślna wartość. Ta domyślna wartość zostanie w kontrolce wpisana jeżeli plik INI nie istnieje lub jeżeli nie istnieje taki klucz.
Podobnie ma się sprawa z wartościami typu Integer lub Boolean:
WriteString, ReadString Odczytuje lub zapisuje wartość typu String.
WriteInteger, ReadInteger Odczytuje lub zapisuje wartość typu Integer.
WriteBool, ReadBool Odczytuje lub zapisuje wartość Boolowską. INI.WriteBool('Ogolne','Konfig',True) = True
WriteFloat, ReadFloat Zapisuje lub odczytuje wartość zmienną przecinkową typu Double
WriteDateTime, ReadDateTime Odczytuje lub zapisuje aktualną datę.
DeleteKey Usuwa daną wartość. INI.DeleteKey('Ogolne','Imie');
ReadSections Zwraca wszystkie sekcje danego pliku w postaci wartości TStrings.
EraseSection Usuwa daną sekcje i pod klucze z nią związane.
ValueExists Sprawdza czy dana wartość istnieje. INI.ValueExists('Ogolne','Imie');
SectionExists Zwraca wartość True jeżeli sekcja o podanej nazwie istnieje.

To tyle. Jeżeli chcesz uzyskać szczegóły to możesz doczytać w systemie pomocy Delphi.
Postanowiłem jeszcze omówić typ "TStrings", a dokładnie "ReadSections". Odczytuje ona z pliku INI wszystkie sekcie i zwraca wynik w postaci zmiennej "TStrings".
Oto przykład:
var
INI : TINIFile;
begin
INI := TINIFile.Create('C:\Plikini.ini');
try
INI.ReadSections(ListBox1.Items);
finally
INI.Free;
end;
end;
Umieść na formie komponent "ListBox" i sprawdź działanie procedury. "Items" przy komponencie "ListBox" oznacza wartości znajdujące się w tym komponencie.

   
©Copyright by garUs